package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup //创建同步等待组的对象

func main() {
	/*
		WaitGroup: 同步等待组
			Add(), 设置等待组中要执行的子 goroutine 的数量

			Wait(), 让主 goroutine 等待，等待所有的 goroutine 都 完成

			Done(), 释放等待信号，每一个 goroutine结束时调用，让等待组中的 counter 计数器的值减 1，同 Add(-1)
	*/
	wg.Add(2)

	go fun0()
	go fun00()

	fmt.Println("main 进入阻塞状态。。等待 wg 中的子goroutine结束。。。")
	wg.Wait() //表示 main goroutine 进入等待，意味着阻塞
	fmt.Println("main。。解除阻塞。。。")
}

func fun0() {
	for i := 1; i < 10; i++ {
		fmt.Println("fun0()函数中打印。。A", i)
	}
	wg.Done() //给 wg 等待组中的 goroutine 数值减 1，同 wg.Add(-1)
}

func fun00() {
	defer wg.Done()
	for i := 1; i < 10; i++ {
		fmt.Println("\tfun2()函数打印。。", i)
	}
}
